package chemtools_logica.BDL.SFBean;

import chemtools_logica.BDL.IL.BDL_SFAlmacenLocal;
import chemtools_logica.BDL.IR.BDL_SFAlmacenRemote;

import chemtools_logica.Beans.AlmacenBean;
import chemtools_logica.Beans.ProductoBean;

import chemtools_logica.Entidades.Almacen;

import chemtools_logica.Entidades.Contenedores;
import chemtools_logica.Entidades.Empresa;

import chemtools_logica.Entidades.Insumo;

import chemtools_logica.Entidades.Producto;

import chemtools_logica.Entidades.Ubigeo;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import javax.ejb.SessionContext;
import javax.ejb.Stateless;

import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless(name = "BDL_SFAlmacen", mappedName = "-BDL_SFAlmacen")
public class BDL_SFAlmacenBean implements BDL_SFAlmacenRemote, BDL_SFAlmacenLocal {
    @Resource
    SessionContext sessionContext;
    @PersistenceContext(unitName = "Chemtools_Logica")
    private EntityManager em;

    public BDL_SFAlmacenBean() {
    }

    public Almacen persistAlmacen(Almacen almacen) {
        em.persist(almacen);
        return almacen;
    }

    public Almacen mergeAlmacen(Almacen almacen) {
        return em.merge(almacen);
    }

    public void removeAlmacen(Almacen almacen) {
        almacen = em.find(Almacen.class, almacen.getIdAlmacen());
        em.remove(almacen);
    }

    /** <code>select o from Almacen o</code> */
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<Almacen> getAlmacenFindAll() {
        return em.createNamedQuery("Almacen.findAll", Almacen.class).getResultList();
    }
    
    public List<Almacen> allAlmacenesActivosInsumo(){
        List<Almacen> listaAlmacen = new ArrayList<Almacen>();
        String ejbQuery = "SELECT u FROM Almacen u " +
                          "WHERE u.estado = 1 " +
                          "AND u.tipoAlmacen = 1";
        
        try{
            Query query = em.createQuery(ejbQuery);
            listaAlmacen = query.getResultList();
        }catch(Exception e)
        {
            listaAlmacen = null;
        }
        
        return listaAlmacen;
    }
    
    public List<Almacen> allAlmacenesActivosProducto(){
        List<Almacen> listaAlmacen = new ArrayList<Almacen>();
        String ejbQuery = "SELECT u FROM Almacen u " +
                          "WHERE u.estado = 1 " +
                          "AND u.tipoAlmacen = 2";
        
        try{
            Query query = em.createQuery(ejbQuery);
            listaAlmacen = query.getResultList();
        }catch(Exception e)
        {
            listaAlmacen = null;
        }
        
        return listaAlmacen;
    }
    
    public List<Almacen>getAlmacenBusqueda(String nombreAlmacen){
        List<Almacen> almacenes = new ArrayList<Almacen>();
        String ejbQuery = "SELECT u FROM Almacen u " +
                          "WHERE u.tipoAlmacen = 1 ";
        if(nombreAlmacen != null){
            ejbQuery +="AND u.nombre like :nombreAlmacen ";
        }
            ejbQuery += "AND u.estado = 1";

        try{
            Query query = em.createQuery(ejbQuery);
            if(nombreAlmacen != null){
                query.setParameter("nombreAlmacen", "%"+nombreAlmacen.toUpperCase()+"%");   
            }
            almacenes = query.getResultList();
        }catch(Exception e)
        {
            almacenes = null;
        }
        
        return almacenes;
    }
    
    public int countInsumosEnAlmacen(int idAlmacen){
        String ejbQuery ="SELECT count(*) "+
                            "FROM eventoxinsumo t1 " +
                            "INNER JOIN insumo AS ins ON t1.idInsumo = ins.idInsumo " +
                            "INNER JOIN almacen AS alm ON t1.idUsuario = alm.idAlmacen "+
                            "INNER JOIN "+
                            "( "+
                              "SELECT MAX(Fecha_Evento) maxdate, idInsumo,idUsuario "+
                              "FROM eventoxinsumo "+
                              "GROUP BY idInsumo "+
                            ") t2 "+
                              "ON t1.idInsumo = t2.idInsumo "+
                              "AND t1.Fecha_Evento = t2.maxdate "+
                            "AND t1.idAlmacen = "+idAlmacen;
        
        Query query = em.createNativeQuery(ejbQuery);
        Long i = (Long)query.getSingleResult();
        
        Integer a = i.intValue();
        
        return a;
    }
    
    public boolean capAlmacenInsums(int idAlmacen){
        int cant = this.countInsumosEnAlmacen(idAlmacen);
        Almacen almacen = new Almacen();
        boolean tOf = false;
        
        String ejbQuery = "SELECT u FROM Almacen u " +
                          "WHERE u.estado = 1 " +
                          "AND u.tipoAlmacen = 1 " +
                          "AND u.idAlmacen = "+idAlmacen;
        
        Query query = em.createQuery(ejbQuery);
        almacen = (Almacen)query.getSingleResult();
        
        if(almacen.getCapacidad() > cant){
            tOf = true;
        }
        
        return tOf;
    }
    
    public boolean capAlamcenProducto(int idAlmacen){
        int cant = this.countInsumosEnAlmacen1(idAlmacen);
        Almacen almacen = new Almacen();
        boolean tOf = false;
        
        String ejbQuery = "SELECT u FROM Almacen u " +
                          "WHERE u.estado = 1 " +
                          "AND u.tipoAlmacen = 2 " +
                          "AND u.idAlmacen = "+idAlmacen;
        
        Query query = em.createQuery(ejbQuery);
        almacen = (Almacen)query.getSingleResult();
        
        if(almacen.getCapacidad() > cant){
            tOf = true;
        }
        
        return tOf;
    }

    public boolean existeNombreAlmacen(String nombre){
        boolean exi = false;
     
        String ejb = "SELECT u FROM Almacen u WHERE upper(u.nombre) = '"+nombre.toUpperCase().trim()+"'";
        
        List<Almacen> almacen = new ArrayList<Almacen>();
        Query query = em.createQuery(ejb);
        almacen = query.getResultList();
        
        if(almacen.size() == 0){
            exi = true;
        }
        
        return exi;
    }
    
    public List<Almacen> getAllAlmacenActivos(){
        List<Almacen> listaEntidad = new ArrayList<Almacen>();
        
        String ejb="SELECT u FROM Almacen  u where u.estado = 1";
        
        try{
        Query query = em.createQuery(ejb);
        listaEntidad = query.getResultList();
        }catch(Exception e){
        }
        
        return listaEntidad;
    }
    public List<Almacen> busquedaAlmacen(AlmacenBean bean){
        List<Almacen> listaEntidad = new ArrayList<Almacen>();
        
        String ejb = "SELECT u FROM Almacen u WHERE 1=1";
        
        if(bean.getEstado() !=  -1){
           ejb += " AND u.estado = " + bean.getEstado();
        }
        
        if(bean.getNombre() != null){
         ejb += " AND u.nombre like '%"+bean.getNombre()+"%'";
         }
        
       
        try{
            
            Query query = em.createQuery(ejb);
            listaEntidad = query.getResultList();
        }catch(Exception e){
            
            listaEntidad = null;
        }
        
        return listaEntidad;
    }
    
    public int countInsumosEnAlmacen1(int idAlmacen){
        String ejbQuery ="SELECT count(*) "+
                            "FROM eventoxproducto t1 " +
                            "INNER JOIN producto AS ins ON t1.idProducto = ins.idProducto " +
                            "INNER JOIN almacen AS alm ON t1.idAlmacen = alm.idAlmacen "+
                            "INNER JOIN "+
                            "( "+
                              "SELECT MAX(Fecha_Evento) maxdate, idProducto,idUsuario "+
                              "FROM eventoxproducto "+
                              "GROUP BY idProducto "+
                            ") t2 "+
                              "ON t1.idProducto = t2.idProducto "+
                              "AND t1.Fecha_Evento = t2.maxdate "+
                            "AND t1.idAlmacen = "+idAlmacen;
        
        Query query = em.createNativeQuery(ejbQuery);
        Long i = (Long)query.getSingleResult();
        
        Integer a = i.intValue();
        
        return a;
    }
    
      public Ubigeo getDatosUbigeo(String idDepartamento, String idProvincia, String idDistrito){
        String ejb="SELECT u FROM Ubigeo u WHERE u.cod_dept = '"+idDepartamento+"' AND u.cod_prov = '"+idProvincia+"' AND u.cod_dist = '"+idDistrito+"'";
        Query query = em.createQuery(ejb);
        Ubigeo ubigeo = (Ubigeo)query.getSingleResult(); 
        
        return ubigeo;
    }   
    
     public boolean almacenTieneProducto(int idAlmacen) {
        String ejbQuery ="SELECT count(*) "+
                            "FROM eventoxproducto t1 " +
                            "INNER JOIN producto AS ins ON t1.idProducto = ins.idProducto " +
                            "INNER JOIN almacen AS alm ON t1.idAlmacen = alm.idAlmacen "+
                            "INNER JOIN "+
                            "( "+
                              "SELECT MAX(Fecha_Evento) maxdate, idProducto,idUsuario "+
                              "FROM eventoxproducto "+
                              "GROUP BY idProducto "+
                            ") t2 "+
                              "ON t1.idProducto = t2.idProducto "+
                              "AND t1.Fecha_Evento = t2.maxdate "+
                              "AND t1.idAlmacen = "+idAlmacen;
        
        Query query = em.createNativeQuery(ejbQuery);
        Long i = (Long)query.getSingleResult();
        
        Integer a = i.intValue();
        boolean cant = true;
        if(a > 0){
            cant = false;
        }
        return cant;
    }
     
     public boolean almacenTieneInsumo(int idAlmacen){
        String ejbQuery ="SELECT count(*) "+
                            "FROM eventoxinsumo t1 " +
                            "INNER JOIN insumo AS ins ON t1.idInsumo = ins.idInsumo " +
                            "INNER JOIN almacen AS alm ON t1.idAlmacen = alm.idAlmacen "+
                            "INNER JOIN "+
                            "( "+
                              "SELECT MAX(Fecha_Evento) maxdate, idInsumo,idUsuario "+
                              "FROM eventoxinsumo "+
                              "GROUP BY idInsumo "+
                            ") t2 "+
                              "ON t1.idInsumo = t2.idInsumo "+
                              "AND t1.Fecha_Evento = t2.maxdate "+
                              "AND t1.idAlmacen = "+idAlmacen;
        
        Query query = em.createNativeQuery(ejbQuery);
        Long i = (Long)query.getSingleResult();
        
        Integer a = i.intValue();
        boolean cant = true;
        if(a > 0){
            cant = false;
        }
        return cant;
     }
 }
